📦 先回顾一下我们已经走过的路:
第 11 章 需求分析 → 第 13 章 画 E-R 图 + 转关系模式 → 第 12 章 规范化(3NF)
到现在为止,你手上已经有 一组规范的关系模式,比如:
商品(商品编号, 商品名, 生产厂家, 入库时间, ...)
但这还不能跑!还差最后一步:把它真正变成一个可以运行的 MySQL 数据库。
👉 这就是本章要讲的:物理结构设计 → 实施 → 运行维护。
一、物理结构设计是什么?了解
1.1 一句话定义
物理结构设计就是 "决定数据怎么存" —— 选什么数据类型、要不要建索引、加什么约束等。
逻辑结构设计(第 13 章)= 决定家里有几个房间、各放什么家具(关系模式)。
物理结构设计(本章)= 决定每件家具用什么材质(数据类型)、要不要装抽屉拉手(索引)、桌子放哪个角落(存储位置)。
家具一样,但材质不同、布局不同,使用体验天差地别。
1.2 物理设计要做的 4 件事了解
物理设计阶段需要决定 4 件事,但我们重点只学前两件(其他了解即可):
- ① 确定数据的存储结构(聚集?索引?)必考
- ② 设计合适的存取路径(用什么方式查询)必考
- ③ 确定数据的存放位置(哪些放在快盘、哪些放在慢盘)了解
- ④ 确定系统配置(DBMS 的各种参数)了解
对学生来说,会用数据类型、会建索引 就够了,③ 和 ④ 是 DBA(数据库管理员)的工作,大部分应用开发人员不需要管。
二、索引与聚集(核心重点)必考
2.1 索引和聚集 —— 加速查询的两大法宝
查询慢是数据库最常见的性能问题。解决办法主要靠两个:
🧲 聚集(Cluster)
把有相同值的记录放在一起存储(同一个物理块里)。
特点:节省存储空间 + 提高同类查询的速度
📑 索引(Index)
给某个字段建立"目录",让查找更快。
特点:查询快 + 但增删改慢(要维护)
2.2 索引(Index)—— 必考核心必考
索引就像 "书的目录" —— 不用翻整本书,直接通过目录查到想要的内容在第几页。
想象一本 1000 页的字典,要查"鸿"字:
① 没有目录:从第 1 页开始一页页翻,平均要翻 500 页才找到 → 全表扫描。
② 有目录(索引):先看目录"鸿 → 第 326 页",直接跳到 326 页 → O(log n) 查找。
索引的作用
① 大大提高查询速度(最主要的作用)
② 在主码上建唯一索引,避免重复值,确保数据完整性
① 占用额外的存储空间(目录本身要占地方)
② 每次增删改时要维护索引(INSERT / UPDATE / DELETE 会变慢)
③ 索引建多了反而 增加 DBMS 选择索引的时间
索引不是越多越好。要在"查询速度" vs "增删改速度" + "存储空间"之间权衡。
2.3 何时建索引?何时不建?必考
这是 必考点,记住这张判断表:
| 场景 | 建议 | 原因 |
|---|---|---|
| 主码(主键) | ✅ 一定要建 | 提高查询速度 + 防止主码重复 |
| 经常出现在 WHERE 子句的字段(频繁查询) | ✅ 应该建 | 大幅提升查询性能 |
| JOIN 时的连接字段(外键) | ✅ 应该建 | 多表连接时性能关键 |
| 频繁更改的字段 | ❌ 不建议建 | 每次更改都要维护索引,得不偿失 |
| 很少用于查询的字段 | ❌ 不要建 | 占空间又用不上 |
| 取值很少(如"性别")的字段 | ❌ 不要建 | 区分度低,索引效果差 |
"主码一定建、查得多的建、改得多的不建、取值少的不建"
2.4 聚集(Cluster)必考
聚集就是把 "同一个属性值相同" 的元组(记录)"放在一起"存储(同一个物理块中)。
这个用来分组的属性叫 聚集码。
图书馆里的书有两种摆法:
① 不聚集:随便往书架上塞,按入库顺序放 —— 找"计算机"类的书要满楼跑。
② 按类别聚集(聚集码 = 类别):所有"计算机"书放一起、"文学"书放一起 —— 一去就能找一片。
① 节省存储空间(重复值压缩)
② 大大提高按聚集码查询的效率
聚集 只对"按聚集码查询" 有加速效果。如果按其他字段查询,反而可能更慢。
所以聚集码要选 查询频率最高、并且用作分组依据 的字段。
💡 在 MySQL 中,InnoDB 表的主键自带聚集(这就是为什么主键查询特别快)。
三、为字段选择合适的数据类型实操必考
3.1 MySQL 常用数据类型速查表必考
物理设计的实操核心就是:给每个字段选合适的数据类型。下面是最常用的几类:
| 类别 | 常用类型 | 什么时候用 |
|---|---|---|
| 整数 | INT / BIGINT / TINYINT |
编号、计数、状态值(小整数用 TINYINT 省空间) |
| 小数 | DECIMAL(M,N) |
金额、价格(精确小数,必须用 DECIMAL) |
| 字符(定长) | CHAR(n) |
长度固定的字段(学号、身份证号、手机号) |
| 字符(变长) | VARCHAR(n) |
长度不定的字段(姓名、地址、商品名) |
| 大文本 | TEXT |
长文本(商品描述、评论),最大 64KB |
| 日期 | DATE |
只到日(生日、入库日期) |
| 日期时间 | DATETIME |
到秒(订单时间、登录时间) |
① 身份证号、手机号用什么?
→ CHAR(18) 或 CHAR(11),不要用 INT!(开头 0 会丢,超出范围)
② 金额用什么?
→ DECIMAL(M,N),不要用 FLOAT 或 DOUBLE!(浮点数会丢精度)
③ 姓名用什么?
→ VARCHAR(20) 或 VARCHAR(50),不用 CHAR(姓名长度不固定)
④ 商品 ID用什么?
→ CHAR(n) 如果是有规律的编码(如"01001"),INT AUTO_INCREMENT 如果是自增主键
3.2 CHAR vs VARCHAR:考试最爱考必考
🔒 CHAR(n) 定长
不管实际多长,固定占 n 个字符的空间(不够用空格补齐)。
✓ 查询速度快
✗ 浪费存储空间(短数据也占满)
适合:长度固定的字段,如学号、身份证号、手机号
📏 VARCHAR(n) 变长
实际多长就占多长,n 只是上限。
✓ 节省存储空间
✗ 查询速度比 CHAR 略慢
适合:长度不定的字段,如姓名、地址、商品名
"长度定 → CHAR;长度变 → VARCHAR"
简单记:身份证号 18 位永远不变 → CHAR(18);姓名可能 2~10 个字 → VARCHAR(20)。
3.3 案例:把第 13 章的关系模式落地
来个实际例子。假设第 13 章设计完,得到了这两个关系模式:
供应商(供应商编号, 供应商名称, 电子邮箱, 联系方式)
商品(商品编号, 商品名, 生产厂家, 入库时间, 概述, 缩略图)
供应商表的物理设计
| 字段名 | 字段描述 | 数据类型 | 约束 | 选型理由 |
|---|---|---|---|---|
| supid | 供应商编号 | CHAR(5) | 主码 | 编号格式固定(如"01000") |
| supname | 供应商名称 | VARCHAR(40) | 非空 | 名称长短不一 |
| 电子邮箱 | VARCHAR(40) | — | 邮箱长短不一,可空 | |
| telephone | 联系方式 | CHAR(11) | — | 手机号固定 11 位 |
商品表的物理设计
| 字段名 | 字段描述 | 数据类型 | 约束 |
|---|---|---|---|
| commodityid | 商品编号 | CHAR(11) | 主码 |
| commodityname | 商品名 | VARCHAR(40) | 非空 |
| manufacturer | 生产厂家 | VARCHAR(40) | — |
| storagetime | 入库时间 | DATETIME | — |
| summary | 概述 | VARCHAR(500) | — |
| thumbnail | 缩略图 | VARCHAR(100) | — |
缩略图本来是图片(二进制数据)。不要直接存到数据库里(图片可能几 MB,会撑爆数据库)。
常见做法:把图片存到磁盘或 OSS,数据库里只存"路径字符串" → 用 VARCHAR(100) 存路径就够了。
四、数据库实施:5 个步骤必考
4.1 什么是数据库实施?
数据库实施 = 把设计图纸变成真实运行的数据库。具体就是:根据前面所有的设计成果,在 MySQL 里建表、装数据、调试程序、试运行。
前面 11~13 章 = 设计师画图纸
本章物理设计 = 选材料(钢筋什么型号、地砖什么品牌)
数据库实施 = 工人按图纸真正盖房子
4.2 实施的 5 个步骤必考
实施过程要走 5 步,必考点是 能按顺序说出这 5 步:
① 建立数据库结构
用 SQL 的 DDL 语句建库、建表、建索引。承接前面所有的设计成果。
CREATE TABLE Supplier (
supid CHAR(5) NOT NULL COMMENT '供应商编号',
supname VARCHAR(40) NOT NULL COMMENT '供应商名称',
email VARCHAR(40) COMMENT '电子邮箱',
telephone CHAR(11) COMMENT '联系方式',
PRIMARY KEY (supid)
);
-- 建索引
CREATE INDEX idx_supname ON Supplier(supname);
② 装入数据
这是 实施阶段最主要的工作。要保证数据 准确无误,必须做严格的 校验。
实际工作中常见做法:
INSERT INTO(少量数据手工录入)LOAD DATA INFILE(从 CSV / Excel 批量导入)- 从老系统迁移数据(写迁移脚本)
③ 应用程序编码与调试
开发能 调用数据库 的程序(网页、App、桌面软件等)。
这部分超出本课程范围,是软件工程的内容。
④ 数据库试运行(联合调试)
这一步要做 两种测试:
① 功能测试:实际运行程序,看每个功能能不能用。
② 性能测试:测试系统的响应时间、吞吐量等性能指标,看是否符合设计目标。
如果测试不达标,要 返回到设计阶段,重新修改设计 —— 有时甚至要回到 逻辑结构设计(第 13 章)重新调整结构。
⑤ 整理文档
编写 测试报告、技术说明书、用户使用说明书,跟系统一起交给用户。
看似不重要,但是真实项目里 很多 bug 修复后没文档记录,下次出问题没人记得。
五、数据库运行维护:4 项工作必考
5.1 为什么要"运行维护"?
数据库一旦投入使用,不是一劳永逸,而是要 长期维护。需求会变化、数据会增长、问题会出现 —— 必须有人持续运维。
这个工作通常由 DBA(数据库管理员) 来做。
5.2 4 项核心维护工作必考
必考点:能按顺序说出这 4 项工作。
转储和恢复数据库
定期 备份 数据库和日志,防止数据丢失。出问题时能 恢复 到正确状态。
📚 第 10 章学过维护安全性与完整性
检查系统安全、给用户分配 权限;调整 完整性约束 以适应新需求。
📚 第 8 章学过监测并改善性能
用工具监测数据库性能,找出 慢的地方(慢 SQL、不合理的索引),进行优化。
📚 慢查询日志重新组织和构造数据库
重组织:不改逻辑结构,重新整理数据存放(碎片整理)。
重构造:改逻辑结构(增加字段、改表结构)。
"备恢复、保安全、调性能、重结构"
= 转储恢复 + 维护安全完整性 + 改善性能 + 重新组织构造
5.3 重组织 vs 重构造了解
这两个词容易搞混,但其实区别很简单:
🔄 重组织
不改逻辑结构,只是重新整理数据的物理存放。
类比:屋子里东西放乱了,重新整理一下,但不挪墙、不加房间。
🏗️ 重构造
修改逻辑结构(加字段、改表结构等)。
类比:客厅打通改大、卧室加个飘窗 —— 房屋结构变了。
六、数据库设计 6 阶段全流程总结必看
📋 完整的数据库设计流程
本章学完,"数据库设计"这条主线就讲完了。从需求到上线运维,我们走过的路:
需求分析 → 概念设计 → 逻辑设计 → 物理设计 → 实施 → 运维
简称:"需 概 逻 物 实 维"。期末必背!
七、本章小结
📋 三句话总结整章
- 物理设计核心是选数据类型+建索引。索引"主码必建、查得多建、改得多不建"。
- 实施就是把设计落地的 5 步:建结构 → 装数据 → 编码调试 → 试运行 → 整理文档。
- 运维是长期工作 4 项:转储恢复、安全完整、性能监测、重组重构。
本章必考点回顾
⭐ 期末考点
- 索引何时建、何时不建(必考!)
- 聚集的概念和作用
- CHAR vs VARCHAR 的区别(数据类型选择)
- 数据库实施的 5 个步骤(顺序题)
- 数据库运行维护的 4 项工作
- 数据库设计的 6 个阶段(综合题/简答题)
课堂综合测验
下列字段中,最不应该 建索引的是?
✅ 正确:C
"性别"只有男/女两种值,区分度极低,建索引基本没用(每次还要扫描一半数据),还浪费空间和增删改时间。
口诀:"主码一定建、查得多的建、改得多的不建、取值少的不建"。
为下列字段选择数据类型,错误 的是?
✅ 错误的是:B
手机号 11 位,不能用 INT!原因:
① 11 位数字可能超出 INT 范围(INT 最大约 21 亿)
② 手机号开头的 0 会被截掉(虽然中国手机号不以 0 开头,但有些国家号码会)
③ 手机号永远不参与运算 —— 用 CHAR(11) 最合适。
数据库实施阶段的 5 个步骤,正确顺序 是?
✅ 正确:B
逻辑:先有表结构(房子盖好),才能往里装数据(搬家具),然后编码(接电接水)、试运行(搬入住一段时间)、最后整理文档(写一份说明书)。
下列 不属于 数据库运行维护工作的是?
✅ 错的是:C
画 E-R 图是 概念结构设计(第 13 章,6 阶段中的第 ② 步),不是运维工作。
运维 4 项工作:转储恢复 + 维护安全完整 + 改善性能 + 重新组织构造。A、B、D 都属于。
数据库设计的 6 个阶段,正确顺序 是?
✅ 正确:B
速记:"需 概 逻 物 实 维"
逻辑:先弄清楚要什么(需求)→ 抽象画图(概念)→ 转关系模式(逻辑)→ 选数据类型(物理)→ 实际建库装数据(实施)→ 长期维护(运维)。
🚀 下节课:习题课
下节课通过练习巩固本章知识:
- 📝 概念巩固(索引、聚集、数据类型)
- 💻 为关系模式选择数据类型(实操题)
- 📋 判断哪些字段该建索引(必考)
- 🎯 综合大题:从给定关系模式 → 物理设计 → 写出 CREATE TABLE
提示:本章是 数据库设计主线的最后一章。后面还会学 第 15 章存储过程与函数、第 16 章触发器和事件、第 17 章 Python 连接 MySQL 这三个高级主题。